본문으로 건너뛰기

오늘 한 일

  • Android 앱개발
  • Rust 만수무강 프로젝트

Kotlin 약알림

RecyclerView 아이템 순서 교환

상황 = 체크한 약은 아래로, 체크하지 않은 약은 위로 정렬하고 싶다.


방법 1. RecyclerView의 초기화 = RecyclerView 재생성
→ 체크할 때마다 Database 변경 & Data 재요청해서 처음 만들 때 정렬

database가 내장형이 아닌 상황에서 너무 오래걸림
item이 변경되는 애니메이션 이펙트의 적용을 할 수 없음

방법 2. itemView의 교환 = RecyclerView는 그대로
→ 체크할 때마다 item의 위치를 변경 & Data는 바꾼다는 신호만 보내고 기다리지 않음

RecyclerView를 초기화할 때 position이 val로 설정
= itemView의 position을 교환할 수 없음


itemView 교환하기

  • position이 변하지 않는다 = itemView의 “View” 위치가 변하지 않는다

→ View 위치를 바꿀 수 없으니 바인딩될 Data의 위치를 바꾸는 것으로 해결
체크할 때마다 해당 item이 바인딩될 위치를 결정 & 그 위치의 아이템과 교환


  • RecyclerView의 View ~ Data 바인딩 이용

onCreateViewHolder() : View 레이아웃 정의
onBindViewHolder() : 데이터 바인딩

→ 바인딩 완료 후 notifyItemMoved(prev, next) 로 바인딩 새로고침 (View는 새로고침 안됨)


  • data position 트래킹 & 고정된 View에 매핑
val indexManager: MutableList<Int> = (0..items.size - 1).toMutableList()

...

// data position 이용
val dataPosition = indexManager.indexOf(position)

val itemToMove = items.removeAt(dataPosition)
items.add(0, itemToMove)
notifyItemMoved(dataPosition, 0)

// 교환에 맞게 data position 트래킹
val indexToMove = indexManager.removeAt(dataPosition)
indexManager.add(0, indexToMove)

position을 값으로 가지는 List 생성
해당 List에서 position이 위치한 index가 현재 데이터 위치를 의미 == position처럼 사용



만수무강

에러 핸들링 로직구현

Alert 창이 없을 때 Alert 핸들링하는 경우

-> 해당 에러 확인 후 Ok(())로 패스


Alert 창이 떠서 에러를 핸들링해야하는 경우

-> 발생가능한 동작에 에러 패턴매칭 후 AlertHandler 실행
-> 발생가능한 동작을 명확하게 구분하기 위해 기능에 따른 리팩토링 완료


UserInfo 보호

user_info.rs 파일 생성 후 상수로 저장

gitignore에 위치 등록